package com.kkb.service;

import com.kkb.bean.Express;
import com.kkb.bean.RankingExpress;
import com.kkb.dao.BaseExpressDao;
import com.kkb.dao.impl.BaseExpressMysql;
import com.kkb.exception.DuplicateCodeException;
import com.kkb.utils.RandomUtil;
import com.kkb.utils.SMSUtil;

import java.util.List;
import java.util.Map;
import java.util.Random;

public class ExpressService  {

    private static BaseExpressDao dao = new BaseExpressMysql();

    /**
     * 用于查询数据库中的全部快递（总数+新增），待取件快递（总数+新增）
     *
     * @return [{size：总数，day：新增},{size:总数，day新增}]
     */
    public static List<Map<String, Integer>> console() {
        return dao.console();
    }

    /**
     * 用于查询所有快递
     *
     * @param limit      标志是否分页，true表示分页，false表示查询所有快递
     * @param pageIndex  页码
     * @param pageNumber 页的数据条数
     * @return 快递的集合
     */
    public static List<Express> findAll(boolean limit, int pageIndex, int pageNumber) {
        return dao.findAll(limit, pageIndex, pageNumber);
    }

    /**
     * 根据快递单号，查询快递信息
     *
     * @param number 单号
     * @return 查询到的快递信息，取件码不存在是返回null
     */
    public static Express findByNumber(String number) {
        return dao.findByNumber(number);
    }

    /**
     * 根据取件码，查询快递信息
     *
     * @param code 取件码
     * @return 查询到的快递信息，取件码不存在是返回null
     */
    public static Express findByCode(String code) {
        return dao.findByCode(code);
    }

    /**
     * 根据手机号，查询快递信息
     *
     * @param phoneNumber 手机号
     * @return 查询到的一些快递信息，手机号不存在是返回null
     */
    public static List<Express> findByPhoneNumber(String phoneNumber) {
        return  dao.findByPhoneNumber(phoneNumber);
    }

    /**
     * 根据录入人的手机号，查询录入的所有快递信息
     *
     * @param sysPhone 手机号
     * @return 查询快递信息列表
     */
    public static List<Express> findBySysPhone(String sysPhone) {
        return dao.findBySysPhone(sysPhone);
    }

    /**
     * 快读的录入
     *
     * @param e 要录入的快递对象
     * @return 录入的结果，true 表示成功，false 表示失败
     */
    public static boolean insert(Express e)  {
        // 生成取件码
        e.setCode(RandomUtil.getCode() + "");
        try {
            boolean insert = dao.insert(e);
            if (insert) {
                // 发送手机短信
                SMSUtil.Send(e.getUserPhone(),e.getCode());
            }
            return insert;
        } catch (DuplicateCodeException duplicateCodeException) {
            // 取件码重复了 + 重新执行
            return insert(e);
        }
    }

    /**
     * 快读的录入
     *
     * @param id         要修改的快递id
     * @param newExpress 新的快递对象（number，company，username，userPhone）
     * @return 录入的结果，true 表示成功，false 表示失败
     *
     * 手机号码变更时，不管是否取件，快递状态都要变为0
     */

    public static boolean update(int id, Express newExpress) {
        if (newExpress.getUserPhone() != null){
            // 用户手机号改变
            dao.delete(id);
            return insert(newExpress);
        } else{
            // !!!!!!!!! 先修改 再修改状态
            boolean update = dao.update(id, newExpress);
            Express express = dao.findByNumber(newExpress.getNumber());
            // 如果将快递的状态修改为 1 时
            if (express.getStatus() == 1){
                dao.updateStatus(express.getCode());
            }
            return update;
        }
    }

    /**
     * 修改快递的状态为1 ，表示快递被取出
     *
     * @param code 取件码
     * @return 修改的结果，true 表示成功，false 表示失败
     */
    public static boolean updateStatus(String code) {
        return dao.updateStatus(code);
    }

    /**
     * 根据id，删除单个快递
     *
     * @param id 要删除快递的id
     * @return 删除结果，true表示成功，false表示失败
     */
    public static boolean delete(int id) {
        return dao.delete(id);
    }


    /**
     * 查询用户未取件的快递列表
     * @return 用户未取件的快递列表
     */
    public static List<Express> findByPhoneAndStatus0(String userPhone,int status){
        return dao.findByPhoneAndStatus(userPhone,status);
    }


    /**
     * 判断 快递单号是否存在
     * @param number 单号
     * @return 存在返回true ，不存在返false
     */
    public static boolean isOneNumber(String number){
        return dao.isOneNumber(number);
    }





}
